﻿using System;

namespace BlogsAPI.BlogsYandex
{
    using System.Collections.Generic;
    using System.Text.RegularExpressions;

    /// <summary>
    /// Класс для возврата распарсенной XML страницы яндекса...
    /// </summary>
    public class YandexParsed
    {
        /// <summary>
        /// Регулярное выражение для получения данных из XML ответа.
        /// </summary>
        private readonly Regex _rGetParsed = new Regex(@"<div class\W+b-text[^<]+<div>(.*?)</div></div><div class\W{2}links[^<]+<a\W+href\W{2}([^'""]+)\W",
            RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);

        /// <summary>
        /// Получение числа общих найденных результатов в XML ответе Яндекса
        /// </summary>
        private readonly Regex _rGetCount = new Regex(@"<b>\d+</b>\s*\w{2}\s*<b>(\d+)</b>",
            RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);


        private int _total;

        /// <summary>
        /// общее число результатов на странице
        /// </summary>
        public int Total
        {
            get
            {
                return _total == 0 ? OParsed.Count : _total;
            }
            set
            {
                _total = value;
            }

        }

        /// <summary>
        /// Результаты.
        /// </summary>
        public List<ParsedResult> OParsed = new List<ParsedResult>();


        /// <summary>
        /// Разбор страницы на данные...
        /// </summary>
        /// <param name="page">код ответа яндекса XML</param>
        /// <param name="isCount">пытаться ли определить общее число объектов, верно лишь для ссылок</param>
        public void Parse(string page)
        {
            MatchCollection mc = _rGetParsed.Matches(page);
            if (mc.Count > 0)
            {
                foreach (Match m in mc)
                {
                    OParsed.Add(new ParsedResult
                    {
                        Title = m.Groups[2].Value,
                        Body = m.Groups[1].Value
                    });
                }
                    //если что-то есть, то нужно обработать общее число результатов
                    Match mcount = _rGetCount.Match(page);
                    if (mcount.Success)
                    {
                        Total = int.Parse(mcount.Groups[1].Value);
                    }
            }
        }
    }
}
